import java.util.Iterator;
import java.util.Map.Entry;
import java.util.HashMap;

public class StatsTri implements Comparable<StatsTri> {
	
	// Décalage (0, 0+1, 0+2)
	public int    dec;
	// Offset par rapport à l'anticodon (... -3 -2 -1 0 1 2 ...)
	public int    off;
	// Compteur de dinucléotides à la position
	public int    cpt;
	// Compteur de dinucléotides différents à la position
	public int    dif;
	// Nombre maximal de dinucléotides différents à la position
	public static int max;
	// Apparition de chaque trinucléotide
	public HashMap <String, Integer> trilist = new HashMap<String, Integer>();

	public StatsTri(int dec, int off, String tri)
	{
		this.dec = dec;
		this.off = off;
		this.cpt = 1;
		this.dif = 1;
		max = 1;
		
		trilist.put(tri, new Integer(1));
	}
	
	public void seen(String tri)
	{
		Integer c = null;
		
		// On rajoute un trinucléotide
		this.cpt++;
		
		// On regarde s'il était déjà ici
		if ((c = trilist.get(tri)) != null)
		{
			// Si oui, on fait +1
			trilist.put(tri, new Integer(c+1));
		}
		else
		{
			// Sinon on l'ajoute
			trilist.put(tri, new Integer(1));
			this.dif++;
			
			max = (this.dif > max) ? this.dif : max;
		}
	}
	
	public boolean equals(Object o)
	{
		StatsTri t = (StatsTri) o;
		return t.dec == this.dec &&
			   t.off == this.off;
	}
	
	public String toString()
	{
		String str = "[" + this.dec + "/" + this.off + "]: " + this.cpt + "\n";
		Iterator<Entry<String, Integer>> it = trilist.entrySet().iterator();
		
	    while (it.hasNext()) {
	        Entry<String, Integer> tri = it.next();
	        int c   = ((Integer) tri.getValue()).intValue();
	        float p = (float) c / cpt * 100;
	        p = (float) (Math.floor(p*100)/100);
	        str += "  " + tri.getKey() + " = " + c + " (" + p + "%)\n";
	    }
	    
	    return str;
	}

	public int compareTo(StatsTri st) {
		if (st.dec == this.dec)
		{
			if (st.off == this.off)
			{
				return (this.cpt == st.cpt)
					   ? 0
					   : (this.cpt < st.cpt) ? 1 : -1;
			}
			
			return (this.off < st.off) ? -1 : 1;
		}
		
		return (this.dec < st.dec) ? -1 : 1;
	}
}